#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>

// 工具
class Util
{
public:
    static int ReadLine(int sock, std::string &out)
    {
        int ch = 'a';
        while (ch != '\n')
        {
            ssize_t s = recv(sock, &ch, 1, 0);
            if (s > 0)
            {
                if (ch == '\r')
                {
                    recv(sock, &ch, 1, MSG_PEEK); // 窥探下一个字符是否是 '\n'
                    if (ch == '\n')
                    {
                        // 要将 \r\n -> \n
                        recv(sock, &ch, 1, 0); // 那就再取一遍
                    }
                    else
                    {
                        ch = '\n';
                    }
                }
                // 此时ch有两种可能（1.普通字符；2.\n）
                out.push_back(ch);
            }
            else if (s == 0) // 读完了
            {
                return 0;
            }
            else // 读入错误
            {
                return -1;
            }
        }
        return out.size();
    }
    
    // 通过Sep将字符串分割
    static bool CutString(const std::string& target, std::string& subl_out, std::string& subr_out, const std::string Sep)
    {
        size_t pos = target.find(Sep);
        if(pos != std::string::npos)
        {
            // 找到啦
            subl_out = target.substr(0, pos);
            subr_out = target.substr(pos+Sep.size());
            return true;
        }
        return false;
    }
};
